package org.elanfox.cloud.mybatis.base;

import com.github.pagehelper.PageInfo;
import org.elanfox.cloud.common.base.BasePO;
import org.elanfox.cloud.common.dto.BaseSearchDTO;

import java.util.List;

/**
 * 一个有标准增删改查方法的服务接口
 * 通过{@link AbstractCrudService <T,ID>}实现了标准的增删改查操作
 * <p>
 * 各个模块的service接口可继承于改接口
 * <p>
 * for example
 * public interface MyService extend CrudService<T,ID></>
 * <p>
 * 同时对于各个模块service的实现，可继承{@link AbstractCrudService <T,ID>}，同时实现相应模块service接口
 * <p>
 * for example:
 * public class MyServiceImpl extend {@link AbstractCrudService <T,ID>} implement MyService
 *
 * @param <T> entity
 * @author allan
 * @date 26/10/2017
 */
public interface CrudService<T extends BasePO, ID> {
    /**
     * 通过id得到一个实体
     *
     * @param id
     * @return
     */
    T findById(ID id);

    T save(T t);

    T save(T t, boolean isUpdate);

    /**
     * 得到所有实例
     *
     * @return
     */
    List<T> findAll();

    T insert(T t);

    T update(T t);

    int deleteById(ID id);

    int deleteByIds(List<ID> ids);

    List<T> findAll(BaseSearchDTO searchDTO);

    /**
     * 根据主键字符串进行查询，类中只有存在一个带有@Id注解的字段
     *
     * @param idList
     * @return
     */
    List<T> findByIds(List<ID> idList);

    /**
     * 根据主键字符串进行查询，类中只有存在一个带有@Id注解的字段
     *
     * @param ids 如 "1,2,3,4"
     * @return
     */
    List<T> findByIds(String ids);

    /**
     * 根据条件分组查找
     *
     * @param pageIndex 页码，索引从1开始
     * @param pageSize  每页数量
     * @param searchDTO 查询条件
     * @return
     */
    PageInfo<T> findAll(int pageIndex, int pageSize, BaseSearchDTO searchDTO);

    PageInfo<T> findAll(int pageIndex, int pageSize);
}
